#include <stdio.h>
#include <iostream>
#include <unistd.h>
#include <signal.h>
//前台进程 VS 后台进程  
//前台进程 命令行启动的  前台进程有+号 用ps ajx查看进程状态
//键盘只有一个 前台进程允许从后台获取数据 任何时刻前台进程只有一个
//后台进程 可以用 ./程序名 & 让程序运行在后台  


//关于信号  在linux终端 用户kill -l查看所有信号 只看1-31 号不考虑0号信号 大部分默认是让进程中止


//信号产生的方式
// 1. 键盘产生
// 2. kill命令
// 3. 使用函数调用
// 4. 软件条件
// 5. 异常
void test()
{
    //验证键盘产生 在键盘上按 ctrl+c 中止进程
    while(true)
    {
        printf("我是一个进程进程：%d\n ",getpid());
        sleep(1);
    }
   
}
void handler(int nums)
{
    std::cout<<"捕捉了一个信号"<<nums<<std::endl;
}

void test2()
{
    //kill(pid ,几号信号)
    //使用函数调用 kill raise(可以给当前进程发送指定的信号(⾃⼰给⾃⼰发信号)) abort 
    // raise 给自己发一个信号可以是任意的
    signal(2, handler); 
    while(true)
    {
        sleep(1);
        raise(2);//自己给自己发送2号信号
    }
    //abort 函数使当前进程接收到信号⽽异常终⽌ 给自己发指定的信号这个信号是不变的
     while(true)
    {
        sleep(1);
        abort();//自己给自己发送2号信号
    }
    //raise 和abort底层都是调用的kill

    //4. 软件条件 比如坏掉的管道或者闹钟
}
void test3()
{
    //5. 异常   模0        
    signal(SIGFPE, handler); // 8) SIGFPE
    sleep(1);
    int a = 10;//这里会有一个现象 明明没有循环为什么会一直打印 
    //原因：如图
    a/=0;
}
int main()
{
   // test2();
    test3();
    return 0;
}